package cn.biplam.front.template.base;

import java.util.ArrayList;

import cn.biplam.common.tools.TOOLS;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.front.html.HtmlAnchor;
import cn.biplam.front.html.HtmlText;
import cn.biplam.front.html.base.Html;
import cn.biplam.front.html.base.HtmlWindow;
import cn.biplam.front.html.base.Const.Window_Event;
import cn.biplam.front.template.Template;

/**
 * Ajx超链接模板
 * @author 	WangSong 2009-6-20 下午09:07:13
 * @version 1.0
 */
public class Anchor implements Template{

	private HtmlAnchor anchor;
	private String sScript;
	private String target;
	private String text;
	/** 对象的咨询信息(工具提示) */
	private String sTitle;
	private int length=8;//基本宽度=8
	private int maxLength=0;
	String defaultColor="blue";

	/**
	 * 构造方法		
	 * @param sScript		点击时执行的脚本
	 * @throws ErrorMessage
	 */
	public Anchor(String sScript) throws ErrorMessage{
		this(sScript,null,null,null);
	}

	/**
	 * 构造方法
	 * @param sScript	点击时执行的脚本
	 * @param text		说明文字
	 * @throws ErrorMessage
	 */
	public Anchor(String sScript,String text) throws ErrorMessage{
		this(sScript,text,null,null);
	}

	/**
	 * 构造方法 
	 * @param sScript	点击时执行的脚本
	 * @param text		说明文字
	 * @param ID		页面ID
	 */
	public Anchor(String sScript,String text,String ID) throws ErrorMessage{
		this(sScript,text,ID,null);
	}

	/**
	 * 构造方法 
	 * @param sScript	点击时执行的脚本
	 * @param text		说明文字
	 * @param ID		页面ID
	 * @param sTitle    对象的提示信息
	 */
	public Anchor(String sScript,String text,String ID,String sTitle) throws ErrorMessage{
		this.sScript=sScript;
		this.text=text;
		this.anchor=new HtmlAnchor(ID);
		this.sTitle = sTitle;
	}

	/**
	 * 放入一个HtmlText
	 */
	public void put(HtmlText text) throws ErrorMessage{
		this.anchor.put(text);
		this.length+=text.length()*6;
		this.length+=2;//左边距=2
	}

	/**
	 * 设置超链接宽度，避免因为onmouseover加粗显示导致后面内容移位
	 */
	private void _set() throws ErrorMessage{
		this.length+=2;//右边距=2

		int newPxLength;
		//设置了最大字符数,需要判断截位处理
		if(this.maxLength>0){
			/**换算成总像素*/
			newPxLength=TOOLS.getPxLengthNorm(this.maxLength);//转换成像素
			newPxLength+=4;//基本像素8+右边距=2

			if(newPxLength<this.length){//设置的最大像素宽度小于当前像素宽度
				ArrayList<Html> aHtml=new ArrayList<Html>();
				if(this.anchor.getAllElements().size()>1){
					this.cutMultiText(aHtml,newPxLength);/**多个文本对象的处理*/
				}else{
					this.cutSingleText(aHtml,newPxLength);/**按最大字符数截位*/
				}
				this.anchor.setAllElements(aHtml);
			}
		}else{
			newPxLength=this.length;
		}

		this.anchor.setStyleWidth(Integer.toString(newPxLength));
		this.anchor.setLength(newPxLength);
	}

	private void cutSingleText(ArrayList<Html> aHtml, int newPxLength) {
		if(this.text!=null){
			aHtml.add(this.cutString(this.text,newPxLength,0));
		}
	}

	/**
	 * 遍历Html容器中的多个HtmlText,按最大像素宽度截取最后超长的文本
	 */
	private void cutMultiText(ArrayList<Html> aHtml, int newPxLength){
		HtmlText txt;

		/**宽度计数器*/
		int iLen=10,iCur;//10=基本宽度(8)+右边距(2)
		/**遍历并复制原有全部HtmlText*/
		for(Html ite:this.anchor.getAllElements()){
			txt=(HtmlText)ite;//取HtmlText对象
			iCur=txt.getLength()*6+2;//换算出当前HtmlText对象的像素宽度,左边距=2
			if((iLen+iCur)>this.maxLength){//如果当前宽度计数器+当前HtmlText对象宽度的和超过了设置最大宽度
				//对当前文本截位,创建新的HtmlText
				aHtml.add(this.cutString(txt.getText(),this.maxLength,iLen));
				break;
			}else{
				//复制并继续
				aHtml.add(ite);
				iLen+=TOOLS.getPxLengthNorm(txt.getLength())+2;
			}
		}
	}
	
	/**
	 * 
	 * @param sTxt		需要进行截位的文本
	 * @param maxLength	最大像素宽度
	 * @param currLen	当前已经使用的像素宽度
	 * @return
	 */
	private HtmlText cutString(String sTxt,int maxLength,int currLen){
		
		/**1.由像素差换算出剩余可显示字符数,减2留出两次边界宽度*/
		int lessChar=(maxLength-currLen)/6-2;
		
		
		/**2.从当前HtmlText对象文本中取出剩余可显示的字符数*/
		StringBuilder sb = TOOLS.cutString(sTxt, lessChar, "");
		
		/**3.创建最后一个的HtmlText对象*/
		
		HtmlText html = new HtmlText(null,"st",sb.toString());
		return html;
	}

	/**
	 * 返回文本字符长度
	 * @return	int
	 */
	public int getLength(){
		return this.length;
	}

	/**
	 * 返回设置好的超链接对象
	 * @return	HtmlWindow
	 * @throws ErrorMessage 
	 */
	public HtmlWindow get() throws ErrorMessage{
		if(this.target!=null){
			anchor.setTarget(target);
		}
		if(this.text!=null){
			this.put(new HtmlText(null,"st",text));
		}
		this.anchor.setTitle(sTitle);
		if(sScript!=null){
			anchor.bind(Window_Event.OnClick,sScript);
		}

		//处理宽度以及截位
		this._set();

		this.anchor.setFontColor(this.getDefaultColor());
		if("blue".equals(this.getDefaultColor())){
			anchor.bind(Window_Event.OnmouseOver,"ab(this);");
		}else{
			anchor.bind(Window_Event.OnmouseOver,"abn(this,'"+this.getDefaultColor()+"');");
		}
		return this.anchor;
	}

	/**
	 * 返回最大字符宽度
	 */
	public int getMaxLength() {
		return maxLength;
	}

	/**
	 * 设置最大字符宽度(0表示不限制)<BR>
	 */
	public void setMaxLength(int maxLength) {
		this.maxLength = maxLength;
	}

	public String getDefaultColor() {
		return defaultColor;
	}

	public void setDefaultColor(String defaultColor) {
		this.defaultColor = defaultColor;
	}
}
